home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 February: Tool Chest / Apple Developer CD Series Tool Chest February 1996 (Apple Computer)(1996).iso / Tool Chest / Development Tools & Languages / • Other Platforms / PCCTS 1.31 / support / genmk / genmk.c next >
Encoding:
C/C++ Source or Header  |  1995-03-10  |  15.4 KB  |  651 lines  |  [TEXT/MPS ]

  1. /*
  2.  * genmk -- a program to make makefiles for PCCTS
  3.  *
  4.  * ANTLR 1.30
  5.  * Terence John Parr 1989 - 1994
  6.  * Purdue University
  7.  * U of MN
  8.  */
  9. #include <stdio.h>
  10. #include "config.h" /* be sensitive to what ANTLR/DLG call the files */
  11.  
  12. #ifdef VAXC
  13. #define DIE        return 0;
  14. #define DONE    return 1;
  15. #else
  16. #define DIE        return 1;
  17. #define DONE    return 0;
  18. #endif
  19.  
  20. #ifndef require
  21. #define require(expr, err) {if ( !(expr) ) fatal(err);}
  22. #endif
  23.  
  24. #define MAX_FILES    50
  25. #define MAX_CLASSES    50
  26.  
  27. char *dlg = "parser.dlg";
  28. char *err = "err.c";
  29. char *hdr = "stdpccts.h";
  30. char *tok = "tokens.h";
  31. char *mode = "mode.h";
  32. char *scan = "scan";
  33.  
  34. char ATOKENBUFFER_O[100];
  35. char APARSER_O[100];
  36. char ASTBASE_O[100];
  37. char PCCTSAST_O[100];
  38. char LIST_O[100];
  39. char DLEXERBASE_O[100];
  40.  
  41. /* Option flags */
  42. static char *project="t", *files[MAX_FILES], *classes[MAX_CLASSES];
  43. static int    num_files = 0;
  44. static int    num_classes = 0;
  45. static int    user_lexer = 0;
  46. static char    *user_token_types = NULL;
  47. static int    gen_CPP = 0;
  48. static char *outdir=".";
  49. static char *dlg_class = "DLGLexer";
  50. static int    gen_trees = 0;
  51.  
  52. typedef struct _Opt {
  53.             char *option;
  54.             int  arg;
  55. #ifdef __cplusplus
  56.             void (*process)(...);
  57. #else
  58.             void (*process)();
  59. #endif
  60.             char *descr;
  61.         } Opt;
  62.  
  63. #ifdef __STDC__
  64. static void ProcessArgs(int, char **, Opt *);
  65. #else
  66. static void ProcessArgs();
  67. #endif
  68.  
  69. static void
  70. pProj( s, t )
  71. char *s;
  72. char *t;
  73. {
  74.     project = t;
  75. }
  76.  
  77. static void
  78. pUL( s )
  79. char *s;
  80. {
  81.     user_lexer = 1;
  82. }
  83.  
  84. static void
  85. pCPP( s )
  86. char *s;
  87. {
  88.     gen_CPP = 1;
  89. }
  90.  
  91. static void
  92. pUT( s, t )
  93. char *s;
  94. char *t;
  95. {
  96.     user_token_types = t;
  97. }
  98.  
  99. static void
  100. pTrees( s )
  101. char *s;
  102. {
  103.     gen_trees = 1;
  104. }
  105.  
  106. static void
  107. #ifdef __STDC__
  108. pFile( char *s )
  109. #else
  110. pFile( s )
  111. char *s;
  112. #endif
  113. {
  114.     if ( *s=='-' )
  115.     {
  116.         fprintf(stderr, "invalid option: '%s'; ignored...",s);
  117.         return;
  118.     }
  119.  
  120.     require(num_files<MAX_FILES, "exceeded max # of input files");
  121.     files[num_files++] = s;
  122. }
  123.  
  124. static void
  125. #ifdef __STDC__
  126. pClass( char *s, char *t )
  127. #else
  128. pClass( s, t )
  129. char *s;
  130. char *t;
  131. #endif
  132. {
  133.     require(num_classes<MAX_CLASSES, "exceeded max # of grammar classes");
  134.     classes[num_classes++] = t;
  135. }
  136.  
  137. static void
  138. #ifdef __STDC__
  139. pDLGClass( char *s, char *t )
  140. #else
  141. pDLGClass( s, t )
  142. char *s;
  143. char *t;
  144. #endif
  145. {
  146.     if ( !gen_CPP ) {
  147.         fprintf(stderr, "-dlg-class makes no sense without C++ mode; ignored...");
  148.     }
  149.     else dlg_class = t;
  150. }
  151.  
  152. static void
  153. #ifdef __STDC__
  154. pOdir( char *s, char *t )
  155. #else
  156. pOdir( s, t )
  157. char *s;
  158. char *t;
  159. #endif
  160. {
  161.     outdir = t;
  162. }
  163.  
  164. static void
  165. #ifdef __STDC__
  166. pHdr( char *s, char *t )
  167. #else
  168. pHdr( s, t )
  169. char *s;
  170. char *t;
  171. #endif
  172. {
  173.     hdr = t;
  174. }
  175.  
  176. Opt options[] = {
  177.     { "-CC", 0,    pCPP,            "Generate C++ output"},
  178.     { "-class", 1,    pClass,        "Name of a grammar class defined in grammar (if C++)"},
  179.     { "-dlg-class", 1,pDLGClass,"Name of DLG lexer class (default=DLGLexer) (if C++)"},
  180.     { "-header", 1,pHdr,        "Name of ANTLR standard header info (default=no file)"},
  181.     { "-o", 1,    pOdir,            "Directory where output files should go (default=\".\")"},
  182.     { "-project", 1,    pProj,    "Name of executable to create (default=t)"},
  183.     { "-token-types", 1, pUT,    "Token types are in this file (don't use tokens.h)"},
  184.     { "-trees", 0, pTrees,        "Generate ASTs"},
  185.     { "-user-lexer", 0,    pUL,    "Do not create a DLG-based scanner"},
  186.     { "*",  0,            pFile,     "" },    /* anything else is a file */
  187.     { NULL, 0, NULL, NULL }
  188. };
  189.  
  190. extern char *DIR();
  191.  
  192. main(argc, argv)
  193. int argc;
  194. char **argv;
  195. {
  196.     if ( argc == 1 ) { help(); DIE; }
  197.     ProcessArgs(argc-1, &(argv[1]), options);
  198.  
  199.     strcpy(ATOKENBUFFER_O, ATOKENBUFFER_C);
  200.     ATOKENBUFFER_O[strlen(ATOKENBUFFER_C)-2] = '\0';
  201.     strcat(ATOKENBUFFER_O, OBJ_FILE_SUFFIX);
  202.     strcpy(APARSER_O, APARSER_C);
  203.     APARSER_O[strlen(APARSER_C)-2] = '\0';
  204.     strcat(APARSER_O, OBJ_FILE_SUFFIX);
  205.  
  206.     strcpy(ASTBASE_O, ASTBASE_C);
  207.     ASTBASE_O[strlen(ASTBASE_C)-2] = '\0';
  208.     strcat(ASTBASE_O, OBJ_FILE_SUFFIX);
  209.  
  210.     strcpy(PCCTSAST_O, PCCTSAST_C);
  211.     PCCTSAST_O[strlen(PCCTSAST_C)-2] = '\0';
  212.     strcat(PCCTSAST_O, OBJ_FILE_SUFFIX);
  213.  
  214.     strcpy(LIST_O, LIST_C);
  215.     LIST_O[strlen(LIST_C)-2] = '\0';
  216.     strcat(LIST_O, OBJ_FILE_SUFFIX);
  217.  
  218.     strcpy(DLEXERBASE_O, DLEXERBASE_C);
  219.     DLEXERBASE_O[strlen(DLEXERBASE_C)-2] = '\0';
  220.     strcat(DLEXERBASE_O, OBJ_FILE_SUFFIX);
  221.  
  222.     if ( num_files == 0 ) fatal("no grammar files specified; exiting...");
  223.     if ( !gen_CPP && num_classes>0 ) {
  224.         warn("can't define classes w/o C++ mode; turning on C++ mode...\n");
  225.         gen_CPP=1;
  226.     }
  227.     if ( gen_CPP && num_classes==0 ) {
  228.         fatal("must define classes >0 grammar classes in C++ mode\n");
  229.     }
  230.  
  231.     mk(project, files, num_files, argc, argv);
  232.     DONE;
  233. }
  234.  
  235. help()
  236. {
  237.     Opt *p = options;
  238.     static char buf[1000+1];
  239.  
  240.     fprintf(stderr, "genmk [options] f1.g ... fn.g\n");
  241.     while ( p->option!=NULL && *(p->option) != '*' )
  242.     {
  243.         buf[0]='\0';
  244.         if ( p->arg ) sprintf(buf, "%s ___", p->option);
  245.         else strcpy(buf, p->option);
  246.         fprintf(stderr, "\t%-16s   %s\n", buf, p->descr);
  247.         p++;
  248.     }
  249. }
  250.  
  251. mk(project, files, n, argc, argv)
  252. char *project;
  253. char **files;
  254. int n;
  255. int argc;
  256. char **argv;
  257. {
  258.     int i;
  259.  
  260.     printf("#\n");
  261.     printf("# PCCTS makefile for: ");
  262.     pfiles(files, n, NULL);
  263.     printf("\n");
  264.     printf("#\n");
  265.     printf("# Created from:");
  266.     for (i=0; i<argc; i++) printf(" %s", argv[i]);
  267.     printf("\n");
  268.     printf("#\n");
  269.     printf("# PCCTS release 1.30\n");
  270.     printf("# Project: %s\n", project);
  271.     if ( gen_CPP ) printf("# C++ output\n");
  272.     else printf("# C output\n");
  273.     if ( user_lexer ) printf("# User-defined scanner\n");
  274.     else printf("# DLG scanner\n");
  275.     if ( user_token_types!=NULL ) printf("# User-defined token types in '%s'\n", user_token_types);
  276.     else printf("# ANTLR-defined token types\n");
  277.     printf("#\n");
  278.     if ( user_token_types!=NULL ) {
  279.         printf("# Make sure #tokdefs directive in ANTLR grammar lists this file:\n");
  280.         printf("TOKENS = %s", user_token_types);
  281.     }
  282.     else printf("TOKENS = %stokens.h", DIR());
  283.     printf("\n");
  284.     printf("#\n");
  285.     printf("# The following filenames must be consistent with ANTLR/DLG flags\n");
  286.     printf("DLG_FILE = %s%s\n", DIR(), dlg);
  287.     printf("ERR = %serr\n", DIR());
  288.     if ( strcmp(hdr,"stdpccts.h")!=0 ) printf("HDR_FILE = %s%s\n", DIR(), hdr);
  289.     else printf("HDR_FILE =\n");
  290.     if ( !gen_CPP ) printf("MOD_FILE = %s%s\n", DIR(), mode);
  291.     if ( !gen_CPP ) printf("SCAN = %s\n", scan);
  292.     else printf("SCAN = %s%s\n", DIR(), dlg_class);
  293.  
  294.     printf("PCCTS = .\n");
  295.     printf("ANTLR_H = $(PCCTS)%sh\n", DirectorySymbol);
  296.     printf("BIN = $(PCCTS)%sbin\n", DirectorySymbol);
  297.     printf("ANTLR = $(BIN)%santlr\n", DirectorySymbol);
  298.     printf("DLG = $(BIN)%sdlg\n", DirectorySymbol);
  299.     printf("CFLAGS = -I. -I$(ANTLR_H)");
  300.     if ( strcmp(outdir, ".")!=0 ) printf(" -I%s", outdir);
  301.     printf("\n");
  302.     printf("AFLAGS =");
  303.     if ( strcmp(outdir,".")!=0 ) printf(" -o %s", outdir);
  304.     if ( user_lexer ) printf(" -gx");
  305.     if ( gen_CPP ) printf(" -CC");
  306.     if ( strcmp(hdr,"stdpccts.h")!=0 ) printf(" -gh %s", hdr);
  307.     if ( gen_trees ) printf(" -gt");
  308.     printf("\n");
  309.     printf("DFLAGS = -C2 -i");
  310.     if ( gen_CPP ) printf(" -CC");
  311.     if ( strcmp(dlg_class,"DLGLexer")!=0 ) printf(" -cl %s", dlg_class);
  312.     if ( strcmp(outdir,".")!=0 ) printf(" -o %s", outdir);
  313.     printf("\n");
  314.     printf("GRM = ");
  315.     pfiles(files, n, NULL);
  316.     printf("\n");
  317.     printf("SRC = ");
  318.     if ( gen_CPP ) pfiles(files, n, "C");
  319.     else pfiles(files, n, "c");
  320.     if ( gen_CPP ) {
  321.         printf(" \\\n     ");
  322.         printf(" ");
  323.         pclasses(classes, num_classes, "C");
  324.         printf(" \\\n      ");
  325.         printf("$(ANTLR_H)%s%s", DirectorySymbol, APARSER_C);
  326.         if ( !user_lexer ) printf(" $(ANTLR_H)%s%s", DirectorySymbol, DLEXERBASE_C);
  327.         if ( gen_trees ) {
  328.             printf(" \\\n      ");
  329.             printf("$(ANTLR_H)%s%s", DirectorySymbol, ASTBASE_C);
  330.             printf(" $(ANTLR_H)%s%s", DirectorySymbol, PCCTSAST_C);
  331.             printf(" $(ANTLR_H)%s%s", DirectorySymbol, LIST_C);
  332.             printf(" \\\n      ");
  333.         }
  334.         printf(" $(ANTLR_H)%s%s", DirectorySymbol, ATOKENBUFFER_C);
  335.     }
  336.     if ( !user_lexer ) {
  337.         if ( gen_CPP ) printf(" $(SCAN)%s", CPP_FILE_SUFFIX);
  338.         else printf(" %s$(SCAN).c", DIR());
  339.     }
  340.     if ( !gen_CPP ) printf(" $(ERR).c");
  341.     printf("\n");
  342.     printf("OBJ = ");
  343.     pfiles(files, n, "o");
  344.     if ( gen_CPP ) {
  345.         printf(" \\\n     ");
  346.         printf(" ");
  347.         pclasses(classes, num_classes, "o");
  348.         printf(" \\\n      ");
  349.         printf(" %s%s", DIR(), APARSER_O);
  350.         if ( !user_lexer ) {
  351.             printf(" %s%s", DIR(), DLEXERBASE_O);
  352.         }
  353.         if ( gen_trees ) {
  354.             printf(" \\\n      ");
  355.             printf("%s%s", DIR(), ASTBASE_O);
  356.             printf(" %s%s", DIR(), PCCTSAST_O);
  357.             printf(" %s%s", DIR(), LIST_O);
  358.             printf(" \\\n      ");
  359.         }
  360.         printf(" %s%s", DIR(), ATOKENBUFFER_O);
  361.     }
  362.     if ( !user_lexer ) {
  363.         if ( gen_CPP ) printf(" $(SCAN)%s", OBJ_FILE_SUFFIX);
  364.         else printf(" %s$(SCAN)%s", DIR(), OBJ_FILE_SUFFIX);
  365.     }
  366.     if ( !gen_CPP ) printf(" $(ERR)%s", OBJ_FILE_SUFFIX);
  367.     printf("\n");
  368.  
  369.     printf("ANTLR_SPAWN = ");
  370.     if ( gen_CPP ) pfiles(files, n, "C");
  371.     else pfiles(files, n, "c");
  372.     if ( gen_CPP ) {
  373.         printf(" ");
  374.         pclasses(classes, num_classes, "C");
  375.         printf(" \\\n              ");
  376.         pclasses(classes, num_classes, "h");
  377.         if ( strcmp(hdr,"stdpccts.h")!=0 ) {
  378.             printf(" \\\n              ");
  379.             printf("$(HDR_FILE) stdpccts.h");
  380.         }
  381.     }
  382.     if ( user_lexer ) {
  383.         if ( !user_token_types ) printf(" $(TOKENS)");
  384.     }
  385.     else {
  386.         printf(" $(DLG_FILE)");
  387.         if ( !user_token_types ) printf(" $(TOKENS)");
  388.     }
  389.     if ( !gen_CPP ) printf(" $(ERR).c");
  390.     printf("\n");
  391.  
  392.     if ( !user_lexer ) {
  393.         if ( gen_CPP ) printf("DLG_SPAWN = $(SCAN)%s", CPP_FILE_SUFFIX);
  394.         else printf("DLG_SPAWN = %s$(SCAN).c", DIR());
  395.         if ( gen_CPP ) printf(" $(SCAN).h");
  396.         if ( !gen_CPP ) printf(" $(MOD_FILE)");
  397.         printf("\n");
  398.     }
  399.  
  400.     if ( gen_CPP ) {
  401.         printf("#CCC=g++\n");
  402.         printf("CC=$(CCC)\n");
  403.     }
  404.     else printf("#CC=cc\n");
  405.  
  406.     /* set up dependencies */
  407.     printf("\n%s : $(OBJ) $(SRC)\n", project);
  408.     printf("    %s -o %s $(CFLAGS) $(OBJ)\n", gen_CPP?"$(CCC)":"$(CC)",project);
  409.     printf("\n");
  410.  
  411.     /* how to compile parser files */
  412.  
  413.     for (i=0; i<num_files; i++)
  414.     {
  415.         pfiles(&files[i], 1, "o");
  416.         if ( user_lexer ) {
  417.             printf(" : $(TOKENS)");
  418.         }
  419.         else {
  420.             if ( gen_CPP ) printf(" : $(TOKENS) $(SCAN).h");
  421.             else printf(" : $(MOD_FILE) $(TOKENS)");
  422.         }
  423.         printf(" ");
  424.         if ( gen_CPP ) pfiles(&files[i], 1, "C");
  425.         else pfiles(&files[i], 1, "c");
  426.         if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");
  427.         printf("\n");
  428.         printf("    %s -c $(CFLAGS) -o ",gen_CPP?"$(CCC)":"$(CC)");
  429.         pfiles(&files[i], 1, "o");
  430.         printf(" ");
  431.         if ( gen_CPP ) pfiles(&files[i], 1, "C");
  432.         else pfiles(&files[i], 1, "c");
  433.         printf("\n\n");
  434.     }
  435.  
  436.     /* how to compile err.c */
  437.     if ( !gen_CPP ) {
  438.         printf("$(ERR)%s : $(ERR).c", OBJ_FILE_SUFFIX);
  439.         if ( !user_lexer ) printf(" $(TOKENS)");
  440.         printf("\n");
  441.         printf("    %s -c $(CFLAGS) -o $(ERR)%s $(ERR).c",gen_CPP?"$(CCC)":"$(CC)", OBJ_FILE_SUFFIX);
  442.         printf("\n\n");
  443.     }
  444.  
  445.     /* how to compile Class.c */
  446.     for (i=0; i<num_classes; i++)
  447.     {
  448.         pclasses(&classes[i], 1, "o");
  449.         if ( user_lexer ) {
  450.             printf(" : $(TOKENS)");
  451.         }
  452.         else {
  453.             printf(" : $(TOKENS) $(SCAN).h");
  454.         }
  455.         printf(" ");
  456.         pclasses(&classes[i], 1, "C");
  457.         printf(" ");
  458.         pclasses(&classes[i], 1, "h");
  459.         if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");
  460.         printf("\n");
  461.         printf("    %s -c $(CFLAGS) -o ",gen_CPP?"$(CCC)":"$(CC)");
  462.         pclasses(&classes[i], 1, "o");
  463.         printf(" ");
  464.         pclasses(&classes[i], 1, "C");
  465.         printf("\n\n");
  466.     }
  467.  
  468.     /* how to compile scan.c */
  469.     if ( !user_lexer ) {
  470.         if ( gen_CPP ) printf("$(SCAN)%s : $(SCAN)%s", OBJ_FILE_SUFFIX, CPP_FILE_SUFFIX);
  471.         else printf("%s$(SCAN)%s : %s$(SCAN).c", DIR(), OBJ_FILE_SUFFIX, DIR());
  472.         if ( !user_lexer ) printf(" $(TOKENS)");
  473.         printf("\n");
  474.         if ( gen_CPP ) printf("    $(CCC) -c $(CFLAGS) -o $(SCAN)%s $(SCAN)%s", OBJ_FILE_SUFFIX, CPP_FILE_SUFFIX);
  475.         else printf("    $(CC) -c $(CFLAGS) -o %s$(SCAN)%s %s$(SCAN).c", DIR(), OBJ_FILE_SUFFIX, DIR());
  476.         printf("\n\n");
  477.     }
  478.  
  479.     printf("$(ANTLR_SPAWN) : $(GRM)\n");
  480.     printf("    $(ANTLR) $(AFLAGS) $(GRM)\n");
  481.  
  482.     if ( !user_lexer )
  483.     {
  484.         printf("\n");
  485.         printf("$(DLG_SPAWN) : $(DLG_FILE)\n");
  486.         if ( gen_CPP ) printf("    $(DLG) $(DFLAGS) $(DLG_FILE)\n");
  487.         else printf("    $(DLG) $(DFLAGS) $(DLG_FILE) $(SCAN).c\n");
  488.     }
  489.  
  490.     /* do the makes for ANTLR/DLG support */
  491.     if ( gen_CPP ) {
  492.         printf("\n");
  493.         printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), APARSER_O, DirectorySymbol, APARSER_C);
  494.         printf("    %s -c $(CFLAGS) -o ",gen_CPP?"$(CCC)":"$(CC)");
  495.         printf("%s%s $(ANTLR_H)%s%s\n", DIR(), APARSER_O, DirectorySymbol, APARSER_C);
  496.         printf("\n");
  497.         printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), ATOKENBUFFER_O, DirectorySymbol, ATOKENBUFFER_C);
  498.         printf("    %s -c $(CFLAGS) -o ",gen_CPP?"$(CCC)":"$(CC)");
  499.         printf("%s%s $(ANTLR_H)%s%s\n", DIR(), ATOKENBUFFER_O, DirectorySymbol, ATOKENBUFFER_C);
  500.         if ( !user_lexer ) {
  501.             printf("\n");
  502.             printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), DLEXERBASE_O, DirectorySymbol, DLEXERBASE_C);
  503.             printf("    %s -c $(CFLAGS) -o ",gen_CPP?"$(CCC)":"$(CC)");
  504.             printf("%s%s $(ANTLR_H)%s%s\n", DIR(), DLEXERBASE_O, DirectorySymbol, DLEXERBASE_C);
  505.         }
  506.         if ( gen_trees ) {
  507.             printf("\n");
  508.             printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), ASTBASE_O, DirectorySymbol, ASTBASE_C);
  509.             printf("    %s -c $(CFLAGS) -o ",gen_CPP?"$(CCC)":"$(CC)");
  510.             printf("%s%s $(ANTLR_H)%s%s\n", DIR(), ASTBASE_O, DirectorySymbol, ASTBASE_C);
  511.             printf("\n");
  512.             printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), PCCTSAST_O, DirectorySymbol, PCCTSAST_C);
  513.             printf("    %s -c $(CFLAGS) -o ",gen_CPP?"$(CCC)":"$(CC)");
  514.             printf("%s%s $(ANTLR_H)%s%s\n", DIR(), PCCTSAST_O, DirectorySymbol, PCCTSAST_C);
  515.             printf("\n");
  516.             printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), LIST_O, DirectorySymbol, LIST_C);
  517.             printf("    %s -c $(CFLAGS) -o ",gen_CPP?"$(CCC)":"$(CC)");
  518.             printf("%s%s $(ANTLR_H)%s%s\n", DIR(), LIST_O, DirectorySymbol, LIST_C);
  519.         }
  520.     }
  521.  
  522.     /* clean and scrub targets */
  523.  
  524.     printf("\nclean:\n");
  525.     printf("    rm -f *%s core %s", OBJ_FILE_SUFFIX, project);
  526.     if ( strcmp(outdir, ".")!=0 ) printf(" %s*%s", DIR(), OBJ_FILE_SUFFIX);
  527.     printf("\n");
  528.  
  529.     printf("\nscrub:\n");
  530.     printf("    rm -f *%s core %s", OBJ_FILE_SUFFIX, project);
  531.     if ( strcmp(outdir, ".")!=0 ) printf(" %s*%s", DIR(), OBJ_FILE_SUFFIX);
  532.     printf(" $(ANTLR_SPAWN)");
  533.     if ( !user_lexer ) printf(" $(DLG_SPAWN)");
  534.     printf("\n");
  535. }
  536.  
  537. pfiles(files, n, suffix)
  538. char **files;
  539. int n;
  540. char *suffix;
  541. {
  542.     int first=1;
  543.  
  544.     while ( n>0 )
  545.     {
  546.         char *p = &(*files)[strlen(*files)-1];
  547.         if ( !first ) putchar(' ');
  548.         first=0;
  549.         while ( p > *files && *p != '.' ) --p;
  550.         if ( p == *files )
  551.         {
  552.             fprintf(stderr,
  553.                     "genmk: filenames must be file.suffix format: %s\n",
  554.                     *files);
  555.             exit(-1);
  556.         }
  557.         if ( suffix == NULL ) printf("%s", *files);
  558.         else
  559.         {
  560.             *p = '\0';
  561.             printf("%s", DIR());
  562.             if ( strcmp(suffix, "o")==0 ) printf("%s%s", *files, OBJ_FILE_SUFFIX);
  563.             else printf("%s.%s", *files, suffix);
  564.             *p = '.';
  565.         }
  566.         files++;
  567.         --n;
  568.     }
  569. }
  570.  
  571. pclasses(classes, n, suffix)
  572. char **classes;
  573. int n;
  574. char *suffix;
  575. {
  576.     int first=1;
  577.  
  578.     while ( n>0 )
  579.     {
  580.         if ( !first ) putchar(' ');
  581.         first=0;
  582.         if ( suffix == NULL ) printf("%s", *classes);
  583.         else {
  584.             printf("%s", DIR());
  585.             if ( strcmp(suffix, "o")==0 ) printf("%s%s", *classes, OBJ_FILE_SUFFIX);
  586.             else printf("%s.%s", *classes, suffix);
  587.         }
  588.         classes++;
  589.         --n;
  590.     }
  591. }
  592.  
  593. static void
  594. #ifdef __STDC__
  595. ProcessArgs( int argc, char **argv, Opt *options )
  596. #else
  597. ProcessArgs( argc, argv, options )
  598. int argc;
  599. char **argv;
  600. Opt *options;
  601. #endif
  602. {
  603.     Opt *p;
  604.     require(argv!=NULL, "ProcessArgs: command line NULL");
  605.  
  606.     while ( argc-- > 0 )
  607.     {
  608.         p = options;
  609.         while ( p->option != NULL )
  610.         {
  611.             if ( strcmp(p->option, "*") == 0 ||
  612.                  strcmp(p->option, *argv) == 0 )
  613.             {
  614.                 if ( p->arg )
  615.                 {
  616.                     (*p->process)( *argv, *(argv+1) );
  617.                     argv++;
  618.                     argc--;
  619.                 }
  620.                 else
  621.                     (*p->process)( *argv );
  622.                 break;
  623.             }
  624.             p++;
  625.         }
  626.         argv++;
  627.     }
  628. }
  629.  
  630. fatal( err_)
  631. char *err_;
  632. {
  633.     fprintf(stderr, "genmk: %s\n", err_);
  634.     exit(1);
  635. }
  636.  
  637. warn( err_)
  638. char *err_;
  639. {
  640.     fprintf(stderr, "genmk: %s\n", err_);
  641. }
  642.  
  643. char *DIR()
  644. {
  645.     static char buf[200+1];
  646.     
  647.     if ( strcmp(outdir,TopDirectory)==0 ) return "";
  648.     sprintf(buf, "%s%s", outdir, DirectorySymbol);
  649.     return buf;
  650. }
  651.